package org.zn.note.designpattern;

import java.util.Arrays;

/**
 * 工厂模式（Factory Pattern）
 * 1、对于简单的对象，直接用new就可以创建的，不用工厂方法，弄复杂了。
 * 2、工厂方法是对于创建对象过程比较复杂的，可以隐藏创建的过程。
 * 3、另外可以根据实际需要，创建不同的实例对象。
 */
public class Pattern01_Factory {

    public static void main(String[] args) {
        Arrays.asList("CIRCLE", "RECTANGLE", "SQUARE").stream().forEach(
                shapeType -> ShapeFactory.getShape(shapeType).draw());
    }

    // 根据传入的参数，创建对应的图形
    private static class ShapeFactory {
        public static Shape getShape(String shapeType) {
            if (shapeType == null) {
                return null;
            }
            if (shapeType.equalsIgnoreCase("CIRCLE")) {
                return new Circle();
            } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
                return new Rectangle();
            } else if (shapeType.equalsIgnoreCase("SQUARE")) {
                return new Square();
            }
            return null;
        }
    }

    // 接口：形状
    interface Shape {
        void draw();
    }

    // 长方形
    static class Rectangle implements Shape {
        @Override
        public void draw() {
            System.out.println("Inside Rectangle::draw() method.");
        }
    }

    // 正方形
    static class Square implements Shape {
        @Override
        public void draw() {
            System.out.println("Inside Square::draw() method.");
        }
    }

    // 圆形
    static class Circle implements Shape {
        @Override
        public void draw() {
            System.out.println("Inside Circle::draw() method.");
        }
    }
}
